import pao = require('../public');
import paoClient = require('./client');
import paoControls = require('./controls');

const moduleName: string = "pao.client";

/**
 * 基础报表模块
 */
@pao.addon("基础报表模块", "可以插入到基础报表的模块", moduleName)
export class baseReportModule extends paoClient.baseControl {
}

/**
 * 数据查询器
 */
export interface dataQueryer {
    /**
     * 查询执行事件
     */
    onQuery? : (dataSourceName: string, parameters: any[string])=> void;
    /**
     * 自动查询时间间隔（单位：毫秒），如果大于零，表示自动执行；如果小于等于0，表示手动执行
     */
    autoQueryInterval?: number;
}

/**
 * 数据显示器
 */
export interface dataDisplayer {
    /**
     * 关联数据源名称列表
     */
    dataSourceNames? : string[];
    /**
     * 清除数据
     */
    clearData?(): void;
    /**
     * 准备数据格式
     */
    prepareDataSchema?(columns: pao.dataColumn[]): void;
    /**
     * 添加数据
     */
    addData?(data: pao.dataTable): void;
}

/**
 * 智能报表
 */
@pao.addon("智能报表", "可以灵活配置的智能报表", moduleName)
@paoClient.template('<div></div>')
export class smartReport extends paoClient.baseView {
    /** 报表模块 */
    modules? : baseReportModule[string];

    /** 布局面板 */
    layoutPanel? : paoControls.layoutPanel;

    /** 数据源列表 */
    dataSources? : pao.dataQuerySource[string];

    onAfterBind?() : void {
        this.layoutPanel.children = this.modules;

        // 绑定数据源事件
        for(let dataSource of this.dataSources) {
            dataSource.onQueryEnd = (data?: any, error?: string) => {
                if(error) {
                    pao.log(error, "error");
                } else {
                    // 刷新数据源
                }
            }
        }

        for(let module of this.modules) {
            // 数据查询器接口
            if(module.autoQueryInterval) {
                module.onQuery = (dataSourceName: string, parameters: any[string]) => {
                    if(this.dataSources && this.dataSources[dataSourceName]) {
                        this.dataSources[dataSourceName].doQuery(parameters);
                    }
                }
            }
        }

        this.layoutPanel.appendTo(this.element);
    }
}

@pao.addon("字段编辑信息", "包含了字段的信息和编辑器信息", moduleName)
export class fieldEditInfo extends pao.dataField {
    /**
     * 编辑器控制器
     */
    editControl?: paoControls.fieldControl;
}

/**
 * 参数控制器
 */
@pao.addon("参数控制器", "用于输入参数的参数控制器", moduleName)
@paoClient.template('<div><div name="fieldContainers"></div><button>查询</button></div>')
export class parameterControl extends baseReportModule implements dataQueryer {
    /**
     * 字段列表
     */
    fields?: fieldEditInfo[];
    /**
     * 自动查询时间间隔
     */
    autoQueryInterval?: number;
    /**
     * 单词查询数量
     */
    queryCount?: number;
    /**
     * 数据源名称
     */
    dataSourceNames?: string[];
    /**
     * 是否查询中
     */
    inQuery?: boolean;
    /**
     * 字段容器
     */
    $fieldContainers?: JQuery = undefined;
    /**
     * 查询执行事件
     */
    onQuery? : (dataSourceName: string, parameters: any[string])=> void;
    /**
     * 获取参数值
     * @return 参数值
     */
    getParamValues?() : any[string] {
        let paramValues = {};
        if(this.fields) {
            for(let field of this.fields) {
                paramValues[field.name] = field.editControl.getValue();
            }
        }
        return paramValues;
    }

    query():void {
        if(this.inQuery)
            return;

        this.inQuery = true;
        try {
            if(!this.queryCount)
                this.queryCount = 500;
    
            // 执行查询
            if(this.dataSourceNames && this.onQuery) {
                for(let dataSourceName of this.dataSourceNames) {
                    this.onQuery(dataSourceName, this.getParamValues());
                }
            }
        } finally {
            this.inQuery = false
        }
    }

    onAfterBind?() : void {
        /**
         * 创建编辑器控件
         */
        let i = 0;
        for(let field of this.fields) {
            field.editControl.appendTo(this.$fieldContainers);
            i++;
        }

        if(this.autoQueryInterval > 0) {
            /**
             * 定期执行查询
             */
            let timer = window.setInterval(()=>{
                this.query();
            }, this.autoQueryInterval);
        }
    }
}

/**
 * 基础数据显示器
 */
@pao.addon("基础数据显示器", "所有数据显示器的基类", moduleName)
@paoClient.template('<div></div>')
export abstract class baseDataDisplayer extends baseReportModule implements dataDisplayer {
    /**
     * 显示数据
     */
    abstract addData?(data: any): void;
    /**
     * 清除数据
     */
    abstract clearData?(): void;
}

/**
 * 图表
 */
@pao.addon("图表", "echart图表", moduleName)
@paoClient.template('<div style="height:200px"></div>')
export class echartDataDisplayer extends baseDataDisplayer {
    /**
     * 图表对象
     */
    private chart : any;

    /**
     * 选项
     */
    options: any;
    /**
     * 清除数据
     */
    clearData?(): void {
        this.chart.clear();
    }
    /**
     * 准备数据格式
     */
    prepareDataSchema?(columns: pao.dataColumn[]): void {

    }
    /**
     * 添加数据
     */
    addData?(data: pao.dataTable): void {
        this.chart.addData(data);
    }
    onAfterBind?() {   
        this.chart = echarts.init(this.element);
        // 为echarts对象加载数据 
        this.chart.setOption(this.options);
    }
}